from django.db import models

"""
继承自AbstractUser类 可以使用系统提供的属性字段,
也可以使用系统提供的方法
"""
from django.contrib.auth.models import AbstractUser
from itsdangerous import TimedJSONWebSignatureSerializer as TJSWS
from django.conf import settings

from utils.models import BaseModel  # 给模型类补充的两个字段

class User(AbstractUser):
    mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')
    email_active = models.BooleanField(default=False, verbose_name="邮箱激活状态")
    # 默认地址
    default_address = models.ForeignKey('Address', related_name='users', null=True, blank=True,
                                        on_delete=models.SET_NULL, verbose_name='默认地址')

    class Meta:
        db_table = "tb_users"

    def __str__(self):
        return self.username

    # 生成验证的链接
    def generate_verify_url(self):
        # 生成要发送的数据
        token = {"user_id": self.id, "email": self.email}
        serializer = TJSWS(secret_key=settings.SECRET_KEY, expires_in=300)  # 获得加密秘钥和有效期
        token = serializer.dumps(token)  # 对token进行加密

        # 拼接到url地址中
        verify_url = "http://www.meiduo.site:8080/success_verify_email.html?token=%s" % token.decode()  # 将字符串进行解密
        # 返回地址
        return verify_url

    # 创建解密方法
    @classmethod  # 由于没有用户对象所以使用类方法装饰成一个类方法
    def decode_token(cls, token):
        # 创建TJSWS对象
        serializer = TJSWS(secret_key=settings.SECRET_KEY, expires_in=300)
        # 解密数据
        try:  # 如果解密失败就返回None
            dict_data = serializer.loads(token)
            user_id = dict_data.get("user_id")   # 得到userid
            user = User.objects.get(id=user_id)  # 获得用户对象
        except Exception:
            return None
        # 返回
        return user



class Address(BaseModel):
    """
    用户地址
    """
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='addresses', verbose_name='用户')
    title = models.CharField(max_length=20, verbose_name='地址名称')
    receiver = models.CharField(max_length=20, verbose_name='收货人')
    province = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='province_addresses', verbose_name='省')
    city = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='city_addresses', verbose_name='市')
    district = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='district_addresses', verbose_name='区')
    place = models.CharField(max_length=50, verbose_name='地址')
    mobile = models.CharField(max_length=11, verbose_name='手机')
    tel = models.CharField(max_length=20, null=True, blank=True, default='', verbose_name='固定电话')
    email = models.CharField(max_length=30, null=True, blank=True, default='', verbose_name='电子邮箱')
    is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_address'
        verbose_name = '用户地址'
        verbose_name_plural = verbose_name
        ordering = ['-update_time']  # 排序
